# 自定义策略:从定义到使用 自定义策略需要:定义可调参数、声明所需数据(DataType)、实现 ``realize()``,再将策略实例加入 Operator。 ## 定义可调参数 使用 **Parameter** 声明可调参数(par_range、name、par_type 等),在策略 ``__init__`` 中通过 **pars=[...]** 传入: ```python from qteasy import BaseStrategy, Parameter class MyStg(BaseStrategy): def __init__(self): super().__init__(pars=[ Parameter('short_period', (5, 20), 10), Parameter('long_period', (20, 60), 30), ]) ``` 这样在优化或手动设置时可通过 ``set_parameter(stg_id, pars={'short_period': 8, 'long_period': 40})`` 调整。 ## 定义所需数据 在策略中声明 **DataType**、**window_length**(回溯长度)、**use_latest_data_cycle** 等,以便框架在运行前准备数据并在 ``realize()`` 中通过 **get_data(dtype_id)** 获取。 ## 实现 realize() - **realize()** 无参数,内部通过 **get_pars()** 取当前参数、**get_data(dtype_id)** 取数据。 - **返回值**:按策略类型约定(如 PT 为 0~1 的仓位标量或向量,PS 为选股列表等)。 ## 加入 Operator 使用 **add_strategy(MyStg(), run_freq=..., run_timing=...)** 将实例加入 Operator;run_freq/run_timing 决定归入哪一 Group。 ## 完整小示例 以下为一个最小可运行的双均线择时示例(逻辑示意,继承基类与 DataType 以实际 API 为准): ```python import qteasy as qt from qteasy import RuleIterator, Parameter class DMA(RuleIterator): def __init__(self): super().__init__(pars=[ Parameter('short_period', (5, 20), 10), Parameter('long_period', (20, 60), 30), ]) def realize(self): close = self.get_data('close') p = self.get_pars() short = close[-p['short_period']:].mean() long_ = close[-p['long_period']:].mean() return 1.0 if short > long_ else 0.0 op = qt.Operator(signal_type='PT', run_freq='d') op.add_strategy(DMA(), run_freq='d', run_timing='open') ``` 更多示例见《使用教程》第 5~7 章。